package com.brillilab.service.core.system;


import com.alibaba.fastjson.JSONObject;
import com.brillilab.common.alioss.OssFileEnum;
import com.brillilab.domain.po.system.FileManage;

import java.util.List;

/**
 * <p>
 * 文件管理 服务类
 * </p>
 *
 * @author zlb
 * @since 2019-05-10
 */
public interface IFileManageService {

    FileManage insert(FileManage fileManage);

    boolean updateById(FileManage fileManage);

    /**
     * 标记删除，非物理删除
     * @param id
     * @return
     */
    boolean deleteById(Long id);

    FileManage selectById(Long id);

    /**
     * 根据数据关联id获取文件列表
     * @param referDataId
     * @return
     */
    List<FileManage> getFileListByReferDataId(Integer referDataId);

    /**
     * 根据条件获取未上传文件
     * @param attachType
     * @param bucketName
     * @param fileName
     * @return
     */
    FileManage selectUnUpload(Integer attachType,String bucketName,String fileName);

    /**
     * 批量插入附件
     * @param fileManages
     * @return
     */
    List<FileManage> insertBatch(List<FileManage> fileManages);

    /**
     * 根据附件类型获取文件列表
     * @param attachType
     * @return
     */
    List<FileManage> getFileListByAttachType(Integer attachType);

    /**
     * 根据附件ID数组获取附件列表
     * @param ids
     * @return
     */
    List<FileManage> selectList(Long[] ids);
    
    /**
     * 根据附件ID数组获取附件列表
     * @param ids
     * @return
     */
    List<FileManage> selectListByIds(List<Long> ids);

    /**
     * 执行回调结果后的业务处理
     * @param jsonObject
     * @return
     */
    Long uploadCallBack(JSONObject jsonObject);

    /**
     * 根据条件获取附件列表
     * @param fileEnum 附件类型
     * @param referDatdId 业务关联ID
     * @return
     */
    List<FileManage> selectList(OssFileEnum fileEnum, Long referDatdId);

    /**
     * 获取文件列表
     * @param attachIds 附件ID集合
     * @return
     */
    List<FileManage> listByIdList(List<Long> attachIds);

    /**
     * 根据实验Id获取自动下载列表（实验结果数据）
     * @param labId
     * @return
     */
    List<FileManage> getAutoFileListByLabId(Long labId);

    /**
     * 根据实验Id集合获取实验结果数据
     * @param experimentIdList
     * @return
     */
    List<FileManage> getAutoFileListByExperimentIdList(List<Long> experimentIdList);

    /**
     * 文件业务数据关联绑定
     * @param fileIds
     * @param referDataId
     * @param fileEnum
     * @param labId
     * @param userId
     */
	void relevanceBatch(Long[] fileIds, Long referDataId, OssFileEnum fileEnum, Long labId, Long userId);

    /**
     * 附件批量初始化
     * @param fileList 文件列表
     * @param referDataId   业务关联ID
     * @param fileEnum      文件枚举
     * @param labId         实验室ID
     * @param userId        用户Id
     * @return
     */
	List<FileManage> insertBatch(List<FileManage> fileList, Long referDataId, OssFileEnum fileEnum, Long labId, Long userId);
	
	  /**
     * 根据url转换上传文件
     *
     * @param urls
     * @return
     */
    List<FileManage> getFileList(String urls);
    
    /**
     * 根据URL文件路径插入
     *
     * @param urls
     */
    List<FileManage> insertBatch(String urls, Long referDataId, OssFileEnum fileEnum, Long labId, Long userId);

	List<FileManage> selectList(OssFileEnum fileEnum, List<Long> referDatdIdList);

    boolean saveFilePublicUrlList(List<String> urlList, Long dataId, OssFileEnum fileEnum);

    /**
     * 根据类型和关联id删除记录（标记删除）(续传
     * @param fileEnum
     * @param referDataId
     */
    void deleteByAttachTypeAndReferDataId(OssFileEnum fileEnum, Long referDataId);

    /**
     * 根据类型和关联id删除记录（标记删除）（直传
     * @param fileEnum
     * @param referDataId
     * @param fileManageId
     */
    void deleteByAttachTypeAndReferDataId(OssFileEnum fileEnum, Long referDataId, Long fileManageId);

    /**
     * 获取文件id数组
     * @param fileEnum
     * @param referDataId
     * @return
     */
    List<Long> selectFileIdArray(OssFileEnum fileEnum, Long referDataId);
    
    /**
     * 获取文件数量
     * @param fileEnum
     * @param referDataId
     * @return
     */
    int selectCount(List<Integer> fileEnums, List<Long> referDataIds);

    /**
     * 批量删除  物理删除
     * @param id
     * @return
     */
    int deleteBatchById(Long[] fileIds);
    
    /**
     * 获取文件数量
     * @param fileEnum
     * @param referDataId
     * @return
     */
    List<FileManage> selectList(List<Integer> fileEnums, List<Long> referDataIds, Boolean isDelete);
    
    /**
     * 获取文件数量
     * @param fileEnum
     * @param referDataId
     * @return
     */
    List<FileManage> selectList(List<Integer> fileEnums);

    /**
     * 批量更新是否下载完
     * @param fileIds
     */
	void updateIsDownload(List<Long> fileIds);
}
